import crypto from 'crypto';

// 使用文档示例中的确切参数进行测试
const testConfig = {
  merchantId: '1324911762826331364', // 文档中的商户ID
  secretKey: process.env.HUIFENG_SECRET_KEY || 'your_secret_key',
  baseUrl: 'https://xhf-uat-api-pay.imbillls.com',
  notifyUrl: 'https://your-domain.com/notify', // 文档中的回调地址
  payType: '600000', // 文档中的支付类型
  country: 'TH'
};

// 生成签名的函数（与文档保持一致）
function generateSign(params: Record<string, any>, secretKey: string, excludeKeys: string[] = ['sign']): string {
  const filteredParams = Object.keys(params)
    .filter(key => !excludeKeys.includes(key) && params[key] !== undefined && params[key] !== '')
    .sort()
    .reduce((obj, key) => {
      obj[key] = params[key];
      return obj;
    }, {} as Record<string, any>);

  const paramString = Object.keys(filteredParams)
    .map(key => `${key}=${filteredParams[key]}`)
    .join('&');

  const signString = paramString + secretKey;
  console.log('🔐 签名原始字符串:', signString.replace(secretKey, '***SECRET***'));

  const sign = crypto.createHash('md5').update(signString).digest('hex').toUpperCase();
  console.log('🔐 生成签名:', sign);

  return sign;
}

// 按照文档示例构建请求数据
async function testWithDocumentExample() {
  console.log('🚀 使用文档示例参数测试汇沣支付API\n');

  console.log('📋 文档示例配置:');
  console.log(`   商户ID: ${testConfig.merchantId}`);
  console.log(`   支付类型: ${testConfig.payType}`);
  console.log(`   API地址: ${testConfig.baseUrl}`);
  console.log(`   回调地址: ${testConfig.notifyUrl}\n`);

  if (!testConfig.secretKey || testConfig.secretKey === 'your_secret_key') {
    console.error('❌ 错误: 请设置环境变量 HUIFENG_SECRET_KEY');
    process.exit(1);
  }

  // 完全按照文档示例构建参数，但所有值都保持为字符串（因为form-urlencoded传输）
  const requestData = {
    merchantId: testConfig.merchantId,        // 字符串格式保持精度
    payType: testConfig.payType,              // 字符串格式
    orderId: '100.00',                        // 文档示例中的订单ID
    amount: '1234567890',                     // 文档示例中的金额
    notifyUrl: testConfig.notifyUrl,          // 文档示例中的回调地址
    country: testConfig.country,
    userName: '张三',                         // 文档示例中的用户名
    accNo: '688899966441',                    // 文档示例中的账号
    bankCode: '1122',                         // 文档示例中的银行编码
    email: '11@gmail.com',                    // 文档示例中的邮箱
    phone: '855772266335',                    // 文档示例中的电话
    user_ip: '127.0.0.1',                     // 文档示例中的IP
    extra: '{"扩展字段1":"字段值"}'             // 文档示例中的扩展参数
  };

  // 生成签名
  const sign = generateSign(requestData, testConfig.secretKey);
  (requestData as any).sign = sign;

  console.log('📋 完整请求参数:', {
    ...requestData,
    sign: '***'
  });

  // 测试Form格式请求
  try {
    console.log('\n📡 测试Form格式请求（文档示例参数）...');

    const formData = new URLSearchParams();
    Object.keys(requestData).forEach(key => {
      if ((requestData as any)[key] !== undefined && (requestData as any)[key] !== '') {
        const value = (requestData as any)[key].toString();
        formData.append(key, value);

        // 记录关键字段
        if (key === 'merchantId' || key === 'payType') {
          console.log(`   ${key}: ${value} (长度: ${value.length})`);
        }
      }
    });

    console.log('\n🔗 发送请求到:', `${testConfig.baseUrl}/pay/collection/create`);
    console.log('📤 Form数据:', formData.toString());

    const response = await fetch(`${testConfig.baseUrl}/pay/collection/create`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'TaiGuoChongZhiSystem/1.0'
      },
      body: formData.toString()
    });

    console.log('\n📊 响应状态:', response.status);
    const result = await response.text();
    console.log('📄 响应内容:', result);

    // 尝试解析JSON
    try {
      const jsonResult = JSON.parse(result);
      console.log('\n✅ 解析后的响应:');
      console.log(JSON.stringify(jsonResult, null, 2));

      if (jsonResult.code === 0) {
        console.log('\n🎉 成功！API接受了文档示例参数！');
      } else {
        console.log('\n⚠️  API返回了错误，但至少接受了参数格式');
      }
    } catch (parseError) {
      console.log('\n❌ 响应不是有效的JSON格式');
    }

  } catch (error) {
    console.error('❌ 请求失败:', (error as Error).message);
  }
}

// 检查商户ID精度
function checkMerchantIdPrecision() {
  console.log('\n🔍 检查商户ID精度处理:');

  const docMerchantId = '1324911762826331364';
  const currentMerchantId = '1335783598896247802';

  console.log('文档商户ID:', docMerchantId);
  console.log('当前商户ID:', currentMerchantId);

  // 检查是否超出安全范围
  const maxSafe = Number.MAX_SAFE_INTEGER.toString();
  console.log('JS安全范围:', maxSafe);

  const docId = BigInt(docMerchantId);
  const currentId = BigInt(currentMerchantId);
  const maxSafeBig = BigInt(maxSafe);

  console.log('文档ID是否超出安全范围:', docId > maxSafeBig);
  console.log('当前ID是否超出安全范围:', currentId > maxSafeBig);

  // 测试Number转换
  console.log('文档ID转Number:', Number(docId));
  console.log('文档ID精度是否丢失:', BigInt(Number(docId)) !== docId);
  console.log('当前ID转Number:', Number(currentId));
  console.log('当前ID精度是否丢失:', BigInt(Number(currentId)) !== currentId);
}

// 主函数
async function main() {
  checkMerchantIdPrecision();
  await testWithDocumentExample();
  console.log('\n🎉 测试完成!');
}

// 运行测试
if (require.main === module) {
  main().catch(console.error);
}